#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import argparse
import sys
import subprocess
import os
import time

def check_camera_availability(camera_id):
    """
    检查摄像头是否可用
    
    Args:
        camera_id (int): 摄像头ID
    
    Returns:
        bool: 摄像头是否可用
    """
    # 在Linux系统上，检查/dev/video设备是否存在
    device_path = f"/dev/video{camera_id}"
    if os.path.exists(device_path):
        print(f"找到摄像头设备: {device_path}")
        return True
    else:
        print(f"未找到摄像头设备: {device_path}")
        return False

def list_cameras(max_cameras=10):
    """
    列出系统中可用的摄像头
    
    Args:
        max_cameras (int): 要检查的最大摄像头数量
    
    Returns:
        list: 可用摄像头ID列表
    """
    available_cameras = []
    for i in range(max_cameras):
        if check_camera_availability(i):
            available_cameras.append(i)
    return available_cameras

def open_camera_with_ffplay(camera_id=0, resolution=None, fps=30):
    """
    使用ffplay打开摄像头并显示图像
    
    Args:
        camera_id (int): 摄像头ID
        resolution (str): 分辨率，格式为"宽x高"
        fps (int): 帧率
    """
    if not check_camera_availability(camera_id):
        print(f"错误：摄像头 {camera_id} 不可用")
        return
    
    # 构建ffplay命令
    cmd = ["ffplay"]
    
    # 添加输入设备
    cmd.extend(["-f", "v4l2", "-i", f"/dev/video{camera_id}"])
    
    # 设置视频大小（如果提供）
    if resolution:
        cmd.extend(["-video_size", resolution])
    
    # 设置帧率
    cmd.extend(["-framerate", str(fps)])
    
    # 设置窗口标题
    cmd.extend(["-window_title", f"摄像头 {camera_id}"])
    
    # 不显示状态信息
    cmd.append("-noborder")
    
    # 实时模式
    cmd.append("-fflags")
    cmd.append("nobuffer")
    
    # 执行命令
    print(f"正在打开摄像头 {camera_id}...")
    print(f"命令: {' '.join(cmd)}")
    
    try:
        process = subprocess.Popen(cmd)
        print("按Ctrl+C退出...")
        # 等待进程结束
        process.wait()
    except KeyboardInterrupt:
        print("\n用户中断，正在关闭...")
        process.terminate()
    except Exception as e:
        print(f"发生错误: {e}")
        if process:
            process.terminate()

def open_camera_with_vlc(camera_id=0, resolution=None, fps=30):
    """
    使用VLC打开摄像头并显示图像
    
    Args:
        camera_id (int): 摄像头ID
        resolution (str): 分辨率，格式为"宽x高"
        fps (int): 帧率
    """
    if not check_camera_availability(camera_id):
        print(f"错误：摄像头 {camera_id} 不可用")
        return
    
    # 构建VLC命令
    cmd = ["vlc"]
    
    # 添加输入设备
    cmd.append(f"v4l2:///dev/video{camera_id}")
    
    # 设置视频大小和帧率（如果提供）
    options = []
    if resolution:
        width, height = resolution.split("x")
        options.append(f"--v4l2-width={width}")
        options.append(f"--v4l2-height={height}")
    
    options.append(f"--v4l2-fps={fps}")
    options.append("--no-audio")
    options.append("--video-title=摄像头 " + str(camera_id))
    
    cmd.extend(options)
    
    # 执行命令
    print(f"正在打开摄像头 {camera_id}...")
    print(f"命令: {' '.join(cmd)}")
    
    try:
        process = subprocess.Popen(cmd)
        print("按Ctrl+C退出...")
        # 等待进程结束
        process.wait()
    except KeyboardInterrupt:
        print("\n用户中断，正在关闭...")
        process.terminate()
    except Exception as e:
        print(f"发生错误: {e}")
        if process:
            process.terminate()

def main():
    # 创建命令行参数解析器
    parser = argparse.ArgumentParser(description='打开相机并显示图像')
    parser.add_argument('-i', '--id', type=int, default=0,
                        help='相机ID (默认: 0)')
    parser.add_argument('-l', '--list', action='store_true',
                        help='列出所有可用的摄像头')
    parser.add_argument('-r', '--resolution', type=str,
                        help='设置分辨率，格式为 宽x高，例如 "640x480"')
    parser.add_argument('-f', '--fps', type=int, default=30,
                        help='设置帧率 (默认: 30)')
    parser.add_argument('-p', '--player', type=str, choices=['ffplay', 'vlc'], default='ffplay',
                        help='选择播放器 (默认: ffplay)')
    
    # 解析命令行参数
    args = parser.parse_args()
    
    # 列出可用摄像头
    if args.list:
        print("正在检查可用摄像头...")
        available_cameras = list_cameras()
        if available_cameras:
            print(f"找到 {len(available_cameras)} 个可用摄像头:")
            for cam_id in available_cameras:
                print(f"  相机 {cam_id}: /dev/video{cam_id}")
        else:
            print("未找到可用摄像头")
        return
    
    # 打开相机
    if args.player == 'ffplay':
        open_camera_with_ffplay(args.id, args.resolution, args.fps)
    else:
        open_camera_with_vlc(args.id, args.resolution, args.fps)

if __name__ == "__main__":
    try:
        main()
    except KeyboardInterrupt:
        print("\n程序被用户中断")
        sys.exit(0)
